virtual void AssertValid( ) const;Отладочная функция. С помощью нее проверяют объект на допустимость значения. Если значения в объекте не допустимые, то вызывается ошибка с номером, в которой указываются номер строки и имя файла, т.е. место совершения ошибки. Для того, чтобы проверить наш объект нам нужно эту функцию перегрузить, написав свой проверочный код. И при этом обычно вызвают одноименный метод базового класса.
#include "afxwin.h"
#include "iostream.h"
class CMyObject : public CObject
{
public:
void AssertValid() const;
protected:
DECLARE_DYNCREATE(CMyObject)
private:
int x;
int y;
};
IMPLEMENT_DYNCREATE(CMyObject,CObject);
void CMyObject::AssertValid() const
{
CObject::AssertValid();
ASSERT(x==100);
ASSERT(y==100);
}
class CAlternativeObject : public CObject
{
protected:
DECLARE_SERIAL(CAlternativeObject);
};
IMPLEMENT_SERIAL(CAlternativeObject,CObject,1);
void main()
{
CMyObject cm;
}
В данном примере мы создали функцию, которая будет проверять, чтобы данные в классе x и y были равны 100. Так как функция const, то изменить значения внутри нее нельзя. Можно только проверить. При этом как вы заметили я не вызывал исключения, а вызывая макрос ASSERT для проверки значений и это правильно. Самому вызывать исключения внутри этой функции нельзя. Проверять можно не только значения, но и указатели, например, если в классе есть ссылка на другие объекты, что эти ссылки действительны. Давайте вызовем ее сразу после создания объекта:
void main()
{
CMyObject cm;
cm.AssertValid();
}
AssertValid - это отладочная функция и применять вы ее можете только в версии DEBUG, во всех остальных она просто изчезнет. Поэтому грамотно проверять конфигурацию компиляции и использовать эту функцию в режиме отладки. Вот так.
......
class CMyObject : public CObject
{
public:
#ifdef _DEBUG
void AssertValid() const;
#endif
protected:
DECLARE_DYNCREATE(CMyObject)
private:
int x;
int y;
};
IMPLEMENT_DYNCREATE(CMyObject,CObject);
#ifdef _DEBUG
void CMyObject::AssertValid() const
{
CObject::AssertValid();
ASSERT(x==100);
ASSERT(y==100);
}
#endif
......
void main()
{
CMyObject cm;
#ifdef _DEBUG
cm.AssertValid();
#endif
}